<?php
/**
 * Created by IntelliJ IDEA.
 * User: XD
 * Date: 2017/8/22
 * Time: 11:21
 */
// 声明一个'iTemplate'接口

interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}

// 实现接口
Class Template implements iTemplate
{
    private $vars = array();

    public function setVariable($name, $var)
    {
        // TODO: Implement setVariable() method
        $this -> vars[$name] = $var;
    }

    public function getHtml($template)
    {
        // TODO: Implement getHtml() method.
        foreach ($this->vars as $name=>$value){
            //字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai"：
            //echo str_replace("world","Shanghai","Hello world!");
            $template = str_replace('{'.$name.'}',$value,$template);
        }
        return $template;
    }
}

//常量
class MyClass
{
    const constant = "常量值";

    function showConstant(){
        echo self::constant.PHP_EOL;
    }
}

echo MyClass::constant.PHP_EOL;

$classname = "MyClass";

echo $classname::constant.PHP_EOL;

$class = new MyClass();
$class->showConstant();

echo $class::constant.PHP_EOL;

// 抽象类
abstract class AbstractClass
{
    // 强制要求子类定义这些方法
    abstract protected function getvalue();
    abstract protected function prefixValue($prefix);

    // 普通方法（非抽象方法）
    public function printOut(){
        print $this->getvalue().PHP_EOL;
    }
}

class ConcreteClass1 extends AbstractClass
{

    protected function getvalue()
    {
        // TODO: Implement getvalue() method.
        return "ConcreteClass1";
    }

    public function prefixValue($prefix)
    {
        // TODO: Implement prefixValue() method.
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{

    protected function getvalue()
    {
        // TODO: Implement getvalue() method.
        return "ConcreteClass2";
    }

    public function prefixValue($prefix)
    {
        // TODO: Implement prefixValue() method.
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;  //不能访问

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;   // 不能访问

// static 静态

class Foo{
    public static $my_static = 'foo';

    public function staticValue(){
        return self::$my_static;
    }
}

print Foo::$my_static.PHP_EOL;
$foo = new Foo();

print $foo->staticValue().PHP_EOL;

// final 和java 差不多 不更改

// 调用父类构造方法

class BaseClass {
    function __construct()
    {
        print "BaseClass 类中构造函数".PHP_EOL;
    }
}

class SubClass extends BaseClass{
    function  __construct()
    {
        parent::__construct();
        print "SubClass 类中构造方法".PHP_EOL;
    }
}

class OtherSubClass extends BaseClass{

}

// 调用 BaseClass 构造方法
$obj = new BaseClass();

// 调用 BaseClass、SubClass 构造方法
$obj = new SubClass();

// 调用 BaseClass 构造方法
$obj = new OtherSubClass();

?>